package com.amt.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.Date;

/**
 * @Title: CcbRequestDataUtil
 * @Package: com.amt.util
 * @Description: TODO(获取建行支付数据)
 * @Author: 江伟
 * @Date: 2020年2月月23日 14:11
 * Copyright (c) ©1994-2021 Scjydz.com All Rights Reserved.
 **/
@Slf4j
public class CcbRequestDataUtil {

    //socket请求地址
    private final static String socketAddress = "192.168.0.204";  //正式:192.168.0.204  测试:220.167.62.133
    //socket请求端口
    private final static Integer socketPort = 12346; //正式:12346 测试:9017
    //商户号
    private final static String merchantId = "105000080620613";
    //柜台号
    private final static String posId = "021765549";
    //操作员id
    private final static String userId = "105000080620613-001";
    //操作员密码
    private final static String passWord = "jhzf001";

    /**
     * @param code      5W1002-支付流水   5W1003-退款流水
     * @param kind      0:未结流水,1:已结流水
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return
     * @description: 递归获取建行数据（返回fastjson）
     */
    public static JSONArray sendCcbRequest(String code, Integer kind, Date beginTime, Date endTime) {
        JSONArray jsonArray = new JSONArray();

        JSONObject jsonObject = getCCBData(code, 1, kind, beginTime, endTime);

        JSONObject TX = jsonObject.getJSONObject("TX");

        //判断返回码
        String RETURN_CODE = TX.get("RETURN_CODE") + "";
        log.info("返回状态结果:{}" + RETURN_CODE);
        if (StringUtils.isEmpty(RETURN_CODE) || !"000000".equals(RETURN_CODE)) {
            log.info("获取建行支付流水失败-时间：{}-原因：{}", DateUtil.getTime(), TX.get("RETURN_MSG"));
            return jsonArray;
        }

        JSONObject TX_INFO = TX.getJSONArray("TX_INFO").getJSONObject(0);
        //当前页次
        Integer CUR_PAGE = TX_INFO.getInteger("CUR_PAGE");
        //总页次
        Integer PAGE_COUNT = 0;
        if ("5W1002".equals(code)) {
            PAGE_COUNT = TX_INFO.getInteger("PAGE_COUNT");
        }
        if ("5W1003".equals(code)) {
            PAGE_COUNT = TX_INFO.getInteger("TPAGE");
        }

        for (int i = CUR_PAGE; i <= PAGE_COUNT; i++) {
            JSONObject json = getCCBData(code, i, kind, beginTime, endTime);
            JSONObject tx = json.getJSONObject("TX");
            //判断返回码
            String returnCode = tx.get("RETURN_CODE") + "";
            if (StringUtils.isEmpty(returnCode) || !"000000".equals(returnCode)) {
                log.info("获取建行支付流水失败-时间：{}-原因：{}", DateUtil.getTime(), tx.get("RETURN_MSG"));
                continue;
            }
            JSONObject txInfo = tx.getJSONArray("TX_INFO").getJSONObject(0);
            jsonArray.add(txInfo.get("LIST"));
        }
//        JSONArray jsonArray = new JSONArray();
//        if (code.equals("5W1002")){
//            JSONObject TX=new JSONObject();
//            TX.put("TRAN_DATE","2019-10-10 15:00:00");
//            TX.put("ORDER","121");
//            TX.put("PAYMENT_MONEY","1");
//            TX.put("ORDER_STATUS","1");
//            jsonArray.add(TX);
//            TX=new JSONObject();
//            TX.put("TRAN_DATE","2019-10-10 15:00:00");
//            TX.put("ORDER","12111");
//            TX.put("PAYMENT_MONEY","2");
//            TX.put("ORDER_STATUS","1");
//            jsonArray.add(TX);
//            TX=new JSONObject();
//            TX.put("TRAN_DATE","2019-10-10 15:00:00");
//            TX.put("ORDER","12112");
//            TX.put("PAYMENT_MONEY","5");
//            TX.put("ORDER_STATUS","1");
//            jsonArray.add(TX);
//        }else {
//            JSONObject TX=new JSONObject();
//            TX.put("REFUND_DATE","2019-10-10 15:00:00");
//            TX.put("ORDER_NUMBER","121");
//            TX.put("REFUNDEMENT_AMOUNT","1");
//            TX.put("STATUS","1");
//            jsonArray.add(TX);
        return jsonArray;
    }

    /**
     * @param code      5W1002-支付流水   5W1003-退款流水
     * @param page      查询页次
     * @param kind      0:未结流水,1:已结流水
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return
     * @description: 转换为fastjson类型的json
     */
    public static JSONObject getCCBData(String code, Integer page, Integer kind, Date beginTime, Date endTime) {
        //1.生成请求报文
        String firstRequestXml = createCcbXMLStr(code, page, kind, beginTime, endTime);
        //2.获取ccb数据
        String firstResponseXml = "";
        try {
            firstResponseXml = SocketHelper.sendSocketRequest(socketAddress, socketPort, firstRequestXml);
        } catch (Exception e) {
            log.info("查询建行退款流水: socket请求失败: {}", e);
        }
        try {
            return XML2JSON.xml2Json(firstResponseXml, "GBK");
        } catch (Exception e) {
            log.info("转换json失败{}",e);
        }
        return null;
    }

    /**
     * @param code      5W1002-支付流水   5W1003-退款流水
     * @param page      查询页次
     * @param kind      0:未结流水,1:已结流水
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return
     * @description: 生成建行请求报文
     */
    public static String createCcbXMLStr(String code, Integer page, Integer kind, Date beginTime, Date endTime) {
        StringBuffer sb = new StringBuffer();
        sb.append("<?xml version=\"1.0\" encoding=\"GB2312\" standalone=\"yes\" ?>");
        sb.append("<TX>");
        //请求序列号
        sb.append("<REQUEST_SN>" + SystemClockUtil.now() + "</REQUEST_SN>");
        //商户号
        sb.append("<CUST_ID>" + merchantId + "</CUST_ID>");
        //操作员号
        sb.append("<USER_ID>" + userId + "</USER_ID>");
        //操作员号密码
        sb.append("<PASSWORD>" + passWord + "</PASSWORD>");
        //交易码
        sb.append("<TX_CODE>" + code + "</TX_CODE>");

        sb.append("<LANGUAGE>CN</LANGUAGE>");

        sb.append("<TX_INFO>");
        //起始日期
        sb.append("<START>" + DateUtil.getDate(beginTime, "yyyyMMdd") + "</START>");
//        sb.append("<START>" + DateHelper.getDate(beginTime,"20181030") + "</START>");
        //开始小时
        sb.append("<STARTHOUR>" + DateUtil.getDate(beginTime, "HH") + "</STARTHOUR>");
        //开始分钟
        sb.append("<STARTMIN>" + DateUtil.getDate(beginTime, "mm") + "</STARTMIN>");
        //截止日期
        sb.append("<END>" + DateUtil.getDate(endTime, "yyyyMMdd") + "</END>");
//        sb.append("<END>" + DateHelper.getDate(endTime,"20181030") + "</END>");
        //结束小时
        sb.append("<ENDHOUR>" + DateUtil.getDate(endTime, "HH") + "</ENDHOUR>");
        //结束分钟
        sb.append("<ENDMIN>" + DateUtil.getDate(endTime, "mm") + "</ENDMIN>");
        //流水类型 0:未结流水,1:已结流水
        sb.append("<KIND>" + kind + "</KIND>");
        //订单号 按订单号查询时，时间段不起作用
        sb.append("<ORDER></ORDER>");
        //结算账户号 暂不用
        sb.append("<ACCOUNT></ACCOUNT>");
        //文件类型 默认为“1”，1:不压缩,2.压缩成zip文件
        if ("5W1002".equals(code)) {
            sb.append("<DEXCEL>1</DEXCEL>");
        }
        //金额 不支持以金额查询
        sb.append("<MONEY></MONEY>");
        //排序 1:交易日期,2:订单号
        sb.append("<NORDERBY>1</NORDERBY>");
        //当前页次
        sb.append("<PAGE>" + page + "</PAGE>");
        //柜台号
        sb.append("<POS_CODE>" + posId + "</POS_CODE>");
        //流水状态 0:交易失败,1:交易成功,2:待银行确认(针对未结流水查询);3:全部
        sb.append("<STATUS>1</STATUS>");

        sb.append("</TX_INFO>");
        sb.append("</TX>");
        return sb.toString();
    }
}
